﻿#pragma once
#include "Panel.h"
#include "NetServer.h"
#include "NetClient.h"

_NAMESPACE_BEGIN

/// 房间描述结构
struct RoomDesc
{
	/// 房间名
	string				hostName;

	/// 服务器主机地址和端口号
	SystemAddress		serverAdd;

	/// 密码，为空则房间未设置密码
	string				passWord;	///<暂时不考虑对该字符串加密

};

//////////////////////////////////////////////////////////////////////////

class PhysBox;
class PhysCar;

/// 网络管理器类，负责管理游戏的联机部分

class NetManager : public Panel 
{
public:

	/// 单体类声明
	SINGLETON_HELPER(NetManager)

	/// 构造函数
	NetManager();

	/// 析构函数
	virtual ~NetManager();

public:

	/// 断开连接
	void							Shutdown();				

	/// 关闭接口
	void							Release();			

	/// 每帧调用的更新函数，重写Panel
	void							Update();

 	/// 创建服务器/
 	void							CreateAsServer();
 
 	/// 创建客户端/
 	void							CreateAsClient();

	/// 等待大厅的网络更新
	void							UpdateWaitingRoom();

	/// 获取网络ID
	UINT							GetNetID();

	/// 探测服务器
	void							SeekforServer(int time);

	/// 房间服务器数量
	UINT							GetServerCount();

	/// 获取房间服务器列表
	void							GetRoomList(UINT id, RoomDesc& out);

	/// 是否处于等待房间状态
	bool							IsWaitingRoom() const 
	{
		return isWaitingRoom; 
	}
	
	/// 设置状态
	void							SetWaitingRoomFlag(bool val)
	{
		isWaitingRoom = val; 
	}

	void							GetSelfCar(PhysCar* car);

public:

	/// 房间列表(服务器)
	std::vector<RoomDesc>			roomList;

	/// 具体接口
	NetInterface*					net;

	/// 是否是等待大厅
	bool							isWaitingRoom;

	Clock							netClock;
};

_NAMESPACE_END